这门课主要涉及的不是具体的代码或者算法实现,而是在机器学习或者深度学习的实践中所积累和总结的做法以及经验之谈。
正交化的概念是各个参数之间不互相影响,当我需要对系统进行调整时,改变当前的参数不会对另外一个产生影响。在机器学习中,有几条准则:
- 如果算法在成本函数上不能很好拟合训练,那么需要一个更大的网络或者更好的优化算法。
- 如果对开发集(dev set)拟合差,但是训练集(train set)拟合好,那么可以用正则化或者增加训练集的方法调整。
- 如果对开发集(dev set)拟合好,但是测试集(test set)拟合差,那么应该用更大的开发集(dev set),因为此时开发集(dev set)可能已经过拟合。
- 如果对测试集(test set)拟合好,但是实际用户体验不佳,那么需要改变开发集(dev set)或者代价函数(cost function),因为此时可能是由于开发集分布设置不正确,或者代价函数的指标不正确。
训练集、开发集和测试集
在训练集中我们可能会尝试很多思路,用训练集训练不同的模型,然后会在开发集上进行选择和评估不同的思路,选择最佳的方法并不断迭代去改善开发集的性能,最后再用测试集去评估。一般来说要使得开发集和测试集保持同一分布,如果不是同一分布则建议将所有数据随机洗牌,放入开发集和测试集。
贝叶斯最优错误率(Bayes Optimal Error)
贝叶斯最优错误率是指一个分类器对某个类别所能达到的最低的分类错误率。
可避免偏差
如果分类器在训练集上的表现和认类的水平有很大差距的话,那么就说明算法对训练集的拟合不好,所以此时就需要减少偏差(bias)。比如训练更大的神经网络,或者跑久一点的梯度下降。另一种情况是训练集上的表现与人类的水平接近,而开发集和训练集的差距较大,则此时应该减少方差,此时可以尝试使用正则化。而可避免偏差所指的就是训练集偏差和人类认知上的差距。
比如上图右半部分的可避免偏差就是0.5%。
误差分析
在对算法进行调整之前可以先检查数据中是否本身出现了问题,比如训练猫识别分类器的训练集中混入了狗的图片,这是可以对狗的图片进行清除,但是此时需要注意的是,如果只是少量的随机错误,那么放着问题不管也可以,因为深度学习算法对训练集中的随机错误是相当健壮的。不过,随机错误可以容忍,但是系统性错误就不可接受,比如一直将某个错误的样本作为正确的样本进行标记,这就可能打乱整个分类器的识别功能。
如果需要修正开发集上的部分数据,那么最好也对测试集中做相同的修正以确保两个数据集来自相同的分布。
使用来自不同分布的数据进行训练和测试
在进行训练的过程中,我们可能遇到训练集和开发、测试集来自不同分布的情况,比如平时训练使用的是高清的图片,而用户的图片可能是模糊的,之前的建议是对用户图片以及自身图片进行混合排列,但是这可能导致用户图片量过小而使得训练的精度下降。所以现在的做法是训练集中使用高清图片,而在开发集和测试集中使用用户上传的可能模糊的图片。
数据分布不匹配时的偏差与方差的分析
如果训练、开发和测试集都是相同分布,那么就用传统的方法分析偏差和方差,但是如果这些数据集中的分布不同,那么就无法确定产生偏差和方差的具体原因,因为此时产生的偏差可能是由于之前这个系统没有识别过模糊图片导致的,其实它在识别清晰图片上的表现优良,所以此时我们可以分出一个训练开发集(train-dev set),这个集合和训练集来自相同分布,这样就能测试出是否出现了方差问题。当这个测试结束后,我们可以将方差训练到很小的程度,如果此时在开发集上的表现不佳,那么就可以说出现了数据不匹配(mismatched data)问题。要处理这个问题,我们可以进行分析两个数据集到底有哪方面的不同,然后看有没有办法手机更多看起来像开发集的数据进行训练。
迁移学习和多任务学习
迁移学习的思想就是利用已经计算的结果对新的需求进行求解,比如如果你已经有了脑部肿瘤的检测模型,那么将它转换到检测肺部肿瘤的检测就是一件可能的事情,进行迁移的时候需要注意,迁移对象A和B需要有相同输入,A的特征应该多过B,其主要应用场景是特征提取(Feature Extraction)和微调(Fine Tuning)。
而多任务学习就是在任务和任务之间共享部分网络结构,能够适应多个不同但是相关的任务。
端到端的深度学习
传统的机器学习方法就是对每个分析过程进行划分,比如对语音进行识别,就分成了声学模型、发音词典、语言模型多个模块,分别对它们进行单独的训练以达到预期效果,但是端到端的训练就抛弃了中间的分析过程,只关心输入和输出,利用神经网络对之前需要分析的特征进行分析。